# name=input('请输入名字:')
# password=input('请输入密码:')
# if name=='clara' and password=='fef':
# print('欢迎')
# else:
#    print('用户名错误或密码错误')
# ........................... if elif
"""
 score = input('请输入成绩:')
 score_int = int(score)
 if score_int >= 90:
  print('A')
 elif score_int >= 80:
    print('B')
 elif score_int >= 70:
     print('C')
 else:
   print('其他')
"""
# while /....

"""
 while True:
 print('人生苦短，我用Python')
"""
# while 后加条件/....
"""
while 1 > 0 and 2 > 0:
 print('人生苦短，我用Python')
"""
# 循环让count每次循环都+1,输出 123456 8910
"""
count = 1
while count <= 10:
    if count != 7:
      print(count)
    count = count + 1
"""
# 另外一种的解题思路 pass
"""
count = 1
while count <= 10:
    if count == 7:
        pass
    else:
        print(count)
    count = count + 1
"""
# 关键字：break
"""
while True:
    print(999)
    break
print('结束')
"""
# break 终止当前循环 实现1~10
"""
count = 1
while True:
    print(count)
    if count == 10:
        break
    count = count + 1
print('结束')
"""
# continue是在背刺循环中不执行以后的操作，从开while开始进行
'''
count = 1
while count <= 10:
    if count == 7:
        count = count+1
        continue
    print(count)
    count = count + 1
'''
# while else 不再满足while后的条件时，触发。或条件=False
'''
count = 1
while count < 10:
    print(count)
    count = count + 1
else:
    print('ELSE代码块')
print('结束')
'''
# 格式化输出:字符格式换存在的意义
'''
name = input('姓名：')
do = input('在干什么：')
template = input('%s在教室%s：' % (name, do,))
print(template)
'''
# 测试占位符的应用
'''
name = input('请输入你的名字：')
age = input('请输入你的年龄：')
job = input('请输入你的工作：')
hobby = input('请输入你的兴趣：')
msg='''
#  ------------------info of %s --------
# Name    : %s
# Age     : %s
# Job     : %s
# Hobbies : %s
# -------------end-----
'''
info = msg % (name, name, age, job, hobby,)
print(info)
'''
# 如句子中出现多个%,如是想显示%，需添加%%
# f = 'clara'
# c = '%s我的阅读率为40%%'%(f,)
#
# print(c)
# 运算符 输出基数
'''
value = 1
while value <= 100:
    #count = value % 2
    if value % 2 == 0:
        print(value)
    value = value + 1
'''
# 1+2+3...+100的和
'''
count = 1
sum = 0
while count <= 100:
    sum = sum + count
    count = count+1
print(sum)
'''
# 1-2+314....+100的结果
'''
count = 1
sum = 0

while count <= 100:
    if count % 2 == 0:
        sum = sum-count
    else:
        sum = sum + count
    sum = sum+count
    count = count+1
print(sum)
'''
# 幂
# value = 5**2
# print(value)
# 整除
# value = 9//2
# print(value)
# or 如第一个值转换成布尔值是真，输出是第一个，则第二
# 如果有多个OR条件，则从左到右依次进行上述流程
'''
value = 0 or 9
value2 = 1 or 9
value1 = 0 or 3 or 9
print(value)
print(value2)
print(value1)
'''
# 对于 and  如果第一个值转换成布尔值是True,则value 是第二个值
# 如果第一个值转换成布尔值是False,则value 是第一个值，多个情况下，则是从左向右
# c = 1 and 4
# f = 1 and 0 and 6
# print(f)
# print(c)
'''
c = 1 and 8 or 0 and 8
c1 = 1 and 8 or 3 and 0
c2 = 3 and 0
c3=  8 or 0
print(c)
print(c1)
print(c2)
print(c3)
'''
# in  判断’‘是否在一串字符串中。
'''
value = input("请输入您来自哪里：")
v = "中国人" in value
print("欢迎我的朋友")
'''
# 可用于敏感内容的筛选
'''
while True:
   value = input("请输入内容：")
   if  "嘉年华" in value :
      print("有敏感词汇请重新输出")
   else:
      print(value)
      break
'''
'''
count = 1
while count <= 3:
    user = input('请输出用户名：')
    pwd = input('请输入密码')
    if user == 'clara' and pwd == 'clara':...
    else:
        print('登录失败')
    if count == 3:
        choice = input ('请输入是否继续（Y/N）:')
        if choice == 'N':
            break
        elif choice == 'Y':
            count = 1
            continue
        else:
            print('输入错误')
            break
    count += 1
'''
# from _future_import  division
# v = 9//2
# print(v)
# upper 大写   lower 小写
# value = 'clara'
# new_value = value.upper()
# new_valueq= new_value.lower()
# print(new_value)
# print(new_valueq)
# 验证码实例
'''
check_code = 'iyUF'
message = '请输出验证码 %s:'%(check_code,)
code = input(message)
new_check_code = check_code.lower()
new_code =  code.lower()
if new_code == new_check_code:
    print('输出成功')
else:
    print('错误!')
'''
'''判断字符串中是否有 数字，isdigit,isnumeric汉字 ，isdecimal unicode数字，，全角数字
while True:
    name = input('请输入你的名字：')
    if name.isnumeric():
        name = str(name)
        print(name)
    else:
      print(name)
'''
'''
# 去除有空格 lstrip  rstrip strip
user = input('请输入你的名字')
# new_user = user.lstrip()
# new_user1 = new_user.rstrip()
# data = new_user1.upper()
data = user.strip()
 print('---->', data, '<-----')
'''
# 替换敏感字
'''
message = input('请说话：')
print(message)
data = message.replace('大爷', '**',3)
print(data)
'''
#  切割 split
'''
message = input('请输入内容')
result = message.split(',', 2)
print(result)
'''
# 计算长度 Len
# name = 'clara'
# number = len(name)
# print(number)
# 索引
# value = 'alex'
# ve = value[3]
# print(ve)
# 输出
'''
value = 'fdfklwjeiwofejkw'
value_len = len(value)
index = 0
while True:
    val = value[index]
    print(val)
    if index == value_len-1:
        break
    index += 1
'''
# 需求：让用户输入任意字符串，获取字符串之后并计算有多少个数字
'''
text = input('请输入内容：')
# strip是去 左右空格的，字符串中的空格不能去掉


index_len = len(text)
index = 0
total =0
while True:
    val = text[index]
   # print(val)
    if val.isdigit():
        total += 1
    if index == index_len-1:
         break
    index += 1
print(total)
'''
# 切片
# v = 'oldboy'
# v1 = v[2:4] #  2<= 索引位置<3
# print(v1)
# 取最后两个字符
'''
index = input('请输入:')
v = index[-2:]
print(v)
'''
# 判断是否已cl 为开头 startswith
'''
name = 'Clara'
if name.startswith('cl'):
    print('含有cl')
else:
    print('NO')
'''
# format 格式化
# name = '我叫{0},年龄是:{1}'.format('clara', 3)
# print(name)
# encode 可以转换编码。可在文件传输，或是存储用到
'''
name ='辛子明'
nameq = name.encode('utf-8')
nameqq = name.encode('gbk')
print(name)
print(nameq)
print(nameqq)
'''
# join 在所输入的全部的单个，插入所连接的内容
'''
name = 'clara'
result = '*'.join(name)
print(result)
'''
# 切片 1:2 是从1开始，1个，后面的2 是步长的意思
'''
name = 'doctsr'
result = name[1:2:2]
print(name)
print(result)
'''
# 将字符 串反转
'''
name = 'clara'
val = name[::-1]
print(name)
print(val)
'''
# for 循环
'''

name = 'clara'
for item in name:
    print(item)
print(name)
'''
# 打印：1-10 ，for 循环+range
# for i in range(1, 11):
#     print(i)
'''
for i in range(1, 11):
    if i == 7:
       pass
    else:
        print(i)
'''  # 无穷用 while 又穷 用 for
# 思路 输入数字相加
'''
content = input('请输入')
content_len = len(content)
index = 0
total = 0
while True:
    char = content[index]
    if char.isdigit():
        total += int(char)
    index += 1
    if index == content_len:
        break
print(total)
'''
# 思路三: # split 分割
'''
content = input('请输入：')
result =  content.split('+')
print(result)
v1 = int(result[0])
v2 = int(result[1])
v3 = v1+v2
print(v3)
'''
# for 循环  写一个输出是“0 Clara 1 doctor 2 smith 3 join”
# 1
'''
users = input('请输入:')
result = users.split(' ')
index = 0
for i in result:
    # print("%s ,%s"  % (index, users[index]) ) # 格式化输出
    print("{0},{1}".format(index, result[index])) # 格式化输出
    index += 1
'''
# 2 方式
'''
users = ['clara','doctor','smith','join']
users_len = len(users)
for index in  range(0,users_len):
    print(index,users[index])

'''
#  append  添加到列表中
'''
use =[]
while True:
     name = input('请输入用户名和密码：')
     use.append(name)
     print(use)
'''
# 登录验证
'''
use = ['clara,34', 'smint,66','efe, 90']
# 用户和密码效验
username = input('请驶入登录用户名：')
password = input('请驶入登录密码：')
for item in use:
     result = item.split(',')
     user = result[0]
     pwd = result[1]
     if user == username and  pwd == password:
         print('登录成功')
         break
'''
# insert 在指定索引位置进行插入元素,remove 是删除列表中的元素，pop是按索引删除的,clear(),删除
# users = ['clara', 'donf', 'fe']
# users.insert(0, 'doctor')
# print(users)
# a = users.remove('clara')
# print(a)
# = users.pop(2)
# print(b)
#  删除索引所在位置
# del users[1] #
# print(users)
# 元组
# 书写规范
# users = [1, 3, 4, 5, '老男孩'] # 列表可变
# new_users = (1, 4, 5, 6, '老男孩') # 元组（不可变）
# 作业
# 1
# name = ['clara', 'doctor', 'smith']
# print(name[::2]) # 按顺序取 ，步长为2
# 2.
# 将 s =['c', 'r','f'] 添加到 上，不使用循环，一行代码实现
# s = ['c', 'r', 'f']
# d = ['r', 'y', 'i']
# d.extend(s) # 可以拼接列表
# print(d)
# 请用三种方式实现字符串的反转 步长，while for
# name = 'Im a doctor,come from Galifuruil'
# value = name[::-1]
# print(value)
# ...............while 方法
'''
name = "I'm a doctor,come from Galifuruil"
name_len = len(name)
print(name_len)
new_name = ''
index = 0
while True:
    new_name += name[name_len-1]
    name_len -= 1
    if name_len == 0:
     break
print(new_name)
'''
# for
'''
name = "I'm a doctor,come from Galifuruil"
name_len = len(name)
value = ''
for item in name:
     value  += name[name_len-1]
     name_len -= 1
print(value)
'''
# 新方法 range (0,10,1)  range(10,-1,-1)
'''
name = "I'm a doctor,come from Galifuruil"
name_len = len(name)-1
v = ''
index = 0
for item in range(name_len, -1, -1):
     v += name[item]
print(v)
'''
# 打印1~100 之间的偶数
# value = list(range(0, 100, 2))
# print(value)
# 练习题
'''
goods = ['汽车', '飞机', '大炮']
for i in range(0,len(goods)):
    print(i+1, goods[i])
num = input('请输入要选择的商品序号：')
num = int(num)-1
print('您选择是的：%s'%(goods[num]))
'''
# 输出偶数
# data_list =[]
# for i in range(0, 101, 2):
#    # if i%2 ==0:
#      data_list.append(i)
# print(data_lit)
# 查找列表li中的元素，移除每个元素的空格，并找出以‘a’开头，并添加到一个新列表中，最后循环打印这个新列表
'''
li = ['clara', 'smith', 'avd', 'egon', 'fedm', 'ads']
data_list = []
for item in li:
    item = item.strip()
    if item.startswith('a'):
        data_list.append(item)
print(data_list)
'''
# 判断是否可以实现，如果可以请写代码实现
# li = ['clara', 'dad', 'smitm', [33, 22, (43, 32,), 11], ('de', 'ke')]
# li[1] = 'c'
# print(li)
# li[4] = ['天地', '日月']
# print(li)
# li[3][2][1] = 9 # 不能删除，因为是元组
# print(li)
# del li[-1]
# print(li)
# 请将'clara'删除，然后在第2个索引位插入’clara‘
# delete = li.pop(0)
# li.insert(2, delete)
# print(li)
# 用户输入， 5 + 99+7+ 2+uu + 7y
'''
content = ' 5 + 99+7+ 2+uu + 7y'
con = content.split('+') # 以+分割出来
total = 0

for item in con:
    cona = item.strip() # 去空格
    if cona.isdigit():
        total += int(cona) # 转换

print(total)
'''
# .join (元素必须是字符串)
'''
nume = [3, 43, 5, 6]

for item in range(0, len(nume)):
    nume[item] = str(nume[item])

stu = '_'.join(nume)
print(nume)
print(stu)
'''
# # 、、、、、、、、、、、、、、、、、、、、
# 字典{} 表示一个事物，或者好多心心的
'''
info = {'name': ' 刘伟达', 'age': 34, 'gender': '男', 'hobby': 'Pingpang'}# :代表键值
print(info['name'])
print(info['age'])
'''
# 字典帮助用户去表示一个事物的信息（事物是有多个属性）data={键：值，键：值，键：值，键：值，键：值，。。。}
# 练习题
'''
userinfo = {'username': 'clara', 'password': 'clara00'}
user = input('请输入用户：')
password = input('请输入密码：')
if userinfo['username'] == user and userinfo['password'] == password:
                print('登陆成功')
else:
    print('登录失败')
'''
# 字典 中属性 dict
# userinfo = {'username': 'clara', 'password': 'clara00'}
# userinfo.keys() # 获取字典中的所有键
# for item in userinfo.keys():
#     print(item)
# userinfo.values() # 获取字典中的所有值
# for i in userinfo.values():
#     print(i)
# item()方法把字典中每对key和value组成一  个元组，并把这些元组放在列表中返回
# for v1,v2 in userinfo.items():
#     print(v1, v2)
# 可删除
# del userinfo['username']
# print(userinfo)
# 可修改
# userinfo['username'] = 'f'
# print(userinfo)
# print(userinfo['username'])
# 按照输入 输出剑指
# for v,k in userinfo.items():
#     print(v,k)
# key = input('请输入：')
# print(userinfo[key])
# 给一个空字典，请在空字典中添加数据
# info = {}
# info['k1'] = '1'
# info['k2'] = '2'
# 给你一个空字典，请让用户输入：key ,value ,将输入的key 和value 添加到字典中
# info = {}
# key = input('请输入key:')
# value = input('请输入value:')
# info[key] = value
# print(info)
# 输入内容，当输入N值时，则表示结束
# info = {}
# index = 0
# while True:
#     key = input('请输入key：')
#     if key == 'N':
#         break
#     value = input('请输入value:')
#     info[key] = value
#
# print(info)
'''
message = 'k1|v1,k2|v2,k3|123'
info = {'k1':'v1','k2':'v2','k3':'123'}
'''
# 实验例子
'''
message = 'k1|v1, k2|v2, k3|123'
info = {}
index = 0
l = message.split(',')
print(len(l))
for i in l:
    # li = i.split('|')
    # info[li[0]]= li[1]
    # 另一种
    v,k =i.split('|')
    info[v]=k
print(info)
'''
# 创建一个用户列表，然后让用户输入用户名和密码进行登录
'''
user_list =[
  {'user':'clara','pwd':'123'},
  {'user':'smith','pwd':'342'},
  {'user':'Join,'pwd':'143'},
  {'user':'doctor','pwd':'162'},
  {'user':'leo','pwd':'363'},
]
'''
# 往一个列表中添加字典
'''
user_list = []
while True:
   u = input('请输入用户：')
   if u == 'N':
         break
   p = input('请输入密码：')
   v = {'username': u, 'pwd': p}
   user_list.append(v)
   print(user_list)
'''
# 登录，登录失败
'''
user_list =[ {'user': 'clara', 'pwd': '123'}, {'user': 'smith', 'pwd': '342'}, {'user': 'doctor', 'pwd': '162'}]
username = input('请输入你的名字：')
password = input('请输入你的密码：')
message = '登录失败'
for item in  user_list:
     if item['user']== username and item['pwd'] == password:
         message = '登陆成功'
         break
print(message)
'''
# reverse 列表中的反转
'''
va = [13,4,55,67,32,8,12]
print(va)
va.sort(reverse= False)
print(va)
va.sort(reverse=True)# 从大到小
print(va)
'''
'''
info = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
result = info.get('kllll')
if result == None: # None 就是 Python中的空
    print('不存在')
if result:
    print('存在')
else:
    print('不存在')
'''
# update :字典里的更新。
# info = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
# info.update({'k5':'k5','k3' :'ff00'})
# print(info)
# 判断一个字符中是否有敏感字符 in
# str
# v = 'Python全站21期'
# if '全站' in v:
#     print('含敏感字符')
# list/tuple， 列表，元组
# v = ['alex', 'oldboy', '常老师', '李启航']
# if 'alex' in v:
#     print('含敏感')
# dict
v = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
# 默认按照判断，及【判断x是否字典的键
# if 'x' in v:
#     pass
# 请判断：k1 是否在其中
# if 'k1' in v:
#     pass
# 请判断： v2 是否在其中？
# 方式一 循环判断
'''
flag = '不存在'
for v in v.values():
    if v == 'v2':
        flag ='存在'
print(flag)
'''
# 方式二
# if 'v2' in list(v.values()): #强制转换成列表['v1','v2','v3']
#     print('win')
#请判断： k2:v2 是否在其中？
'''
value = v.get('k2')
if value == 'v2':
    print('存在')
else:
    print('不存在')
'''
#  让用户输入任意字符串，然后判断此字符串是否包含制定个的敏感字符
# char_list = ['李思涵', '李梦是','周建珍']
# content = input('请输入内容：')
# message ='不敏感词汇'
# if content in char_list:
#     message = '还有敏感词汇'
# print(message)

# 集合 set  无序，无重复
# v = {1, 2, 3, 4, 5, 90}
# 空集合
# v = set()
#  set 添加add
v = {1, 2, 'clara0', 'smith'}
# v.add('clara')
# 删除 discard
# v.discard(1)
# update 批量增加
# v.update({2,34,3})
# 取交集
# result = v.intersection({1,2})
# 取交集
# result = v.union({1, 2})
# 取差集
# result = v.difference({1, 2})
# print(result)
# len
# v = {1, 2, 'Clara'}
# print(len(v))
# for
# v = {1,2,'clara'}
# for item in v:
#     print(item)
# 列表/字典/集合-》 不能放在集合中+不能作为字典的key,(unhashable)
# info = {1,2,3,4,True,'国风',None,(1,2,3)}
# print(info)
#  数据多时，尽量不要用列表存储，可用集合
# 特殊情况
# info = {
#     1 : 'alex',
#     True : 'oldboy'
# }
# print(info)
# 练习1 ,内部修改
'''
v1 = [11, 22,33]
v2 = v1
v1.append(666)
print(v2)  # 含666
'''
# 练习题2：赋值
'''
v1 = [11, 22, 33]
v2 = v1
v1 = [1,2,3,4]
print(v2)
'''
# 练习3 ：（重新赋值）
# v1 = 'alex'
# v2 = v1
# v1 = 'oldboy'
# print(v2)
'''
v1 = [1, 2 , 3]
v2 = v1
print(id(v1),id(v2))
v1 = 999
print(id(v1),id(v2))# 查询地址
'''
# ==  和 is 的却别？== 比较 值，? 比较的是地址
# 列表
# reverse sort
# 字典
# get update
# 集合
# add discard update intersection union difference
# v = 1 or 0 and 8 or 9
# print(v)
# a = 11 and 8
# b = 1 or 2
# print(a)
# print(b)
# 循环提示用户输入，根据用户输入的值为键，并从字典中获取对应的值并输出
#
#
# while True:
#     content = input('请输入：')
#     val=info.get(content,'键不存在')
#     print(val)
# 请用代码验证“name" 是否在字典的键中
# info = {'name': '王刚蛋', 'hobby': '铁锤','age' : 12 ,'gender': 'boy'}
# message = '不存在'
# for item in info.keys():
#     if  item == 'df':
#        message = '存在'
# print(message)
# 请用代码验证“clara" 是否在字典的值中
# 一种
# info = {'name': '王刚蛋', 'hobby': '铁锤','age' : 12 ,'gender': 'boy'}
# message = '不存在'
# for item in info.values():
#     if  item == '王刚蛋':
#        message = '存在'
# print(message)
# 另一种
# info = {'name': '王刚蛋', 'hobby': '铁锤','age' : 12 ,'gender': 'boy'}
# flag = False
# for item in info.values():
#     if  item == '王刚蛋':
#        flag = True
# if  flag:
#     print('存在')
# else:
#     print('不存在')
# 将输入的内容添加到列表中，若是输入N /n 程序截止
'''
data_list = []
index =0
while True:
 value = input('请输入：') # N 、n
 if value.upper() == 'N':
      break
 data_list.append(value)
 index +=1
print(data_list)
'''
# 将输入的内容添加到集合中，若是输入N /n 程序截止
'''
data_list =set()
index =0
while True:
 value = input('请输入：') # N 、n
 if value.upper() == 'N':
      break
 data_list.add(value)
 index +=1
print(data_list)
'''
# 循环提示用户输入，如果输入值在v1 中存在，则追加到v2中，如果v1 中不存在。则添加到v1中
'''
#第一种
v1 = {'alex', '武sir', '肖大'}
v2 = []
content = input('请输入：')
flag = False
for item in v1:
    if content == item:
        flag = True
if  flag:
    v2.append(content)
else:
    v1.add(content)
print(v1)
print(v2)
'''
'''
# 第二种
v1 = {'alex', '武sir', '肖大'}
v2 = []
while True:
    v = input('>>>')
    if  v in v1:
        v2.append(v)
    else:
        v1.add(v)
        break
print(v1)
print(v2)
'''
# 判断是否是字符串
'''
v = {'k1':'v1'}
if type(v) == str:
    print('%s是字符串'%(v))
elif  type(v) == dict:
    print('%s是字典'%(v))
'''
'''
v1 = {1,2,3}
v2 = v1
n = v1.intersection([1,88,9])
print(v1,v2)
print(n)
'''
# v1 = '人生苦短'
# v2 = [1,2,3,4,v1]
# v1 = 'python'
# print(v2)
# info = [1, 2, 3]
# userinfo = [info ,info, info,info]
# userinfo[2][0] = '闭嘴'
# print(info,userinfo)
'''
info = [1, 2, 3]
user_list = []
for item in range(10):
    user_list.append(info)
info[1] = '是谁说Python好学的？'
print(user_list)
'''
'''
data = {}
for i in range(10):
    data['user'] = i
print(data)
print(list(range(10)))
'''
'''
data_list =[]
for i in range(10):
    data = {}
    data['user'] = i
    data_list.append(data)
print(data_list)
'''
# 查看地址相同
# data = [1, 2, 3, 4]
# nums =[]
# for i in data:
#     # nums.append(i)
#     nums.append(str(i))
# print(id(data[0]))
# print(data)
# print(id(nums[0]))
# print(nums)
'''
data = ['alex', 'eric', 'seven']
nums = []
for i in data:
    # nums.append(i.upper()) 地址不一样
    nums.append(i+ 'xxx')
print(id(data[0]))
print(id(nums))
'''
'''
v1 =[
    [1, 3,4 ,6]
    ,[2, 6 ,7 ,8]
]
v2 = []
for item in v1 :
    v2.append(item)
print(id(v1),id(v2))
print(id(v1[0]),id(v2[0]))
'''
# 浅拷贝： 拷贝第一层
# 深拷贝：拷贝所有数据（可变）
# v1 = 'alfdfefdsfex'
# import copy
# v2 = copy.copy(v1)
# print(id(v1),id(v2))
# v3 =copy.deepcopy(v1)
# print(id(v3))
# 文件操作 打开-操作-关闭
# 打开文件
'''
file_object = open('c.txt', mode = 'r', encoding = 'utf-8') # mode 值的是模式，r:只读，w:只写,(会把之前的清空)
# 读取文件
content = file_object.read()
print(content)
#关闭文件
file_object.close()
'''
# 。。。。。。。。。。。。
# 写入 a ,只追加，不能读
'''
file_object = open('c.txt', mode = 'a', encoding = 'utf-8') # mode 值的是模式，r:只读，w:只写,(会把之前的清空)
# 读取文件
# content = file_object.read()
# 写入
file_object.write('你好')
# print(content)
#关闭文件
file_object.close()
'''
#  可读可写
'''
读写
写入：根据光标的位置，从当前光标位置开始进行写入操作（可能会将其他的文字覆盖）
'''
'''
file_object = open('c.txt', mode = 'r+', encoding = 'utf-8') # mode 值的是模式，r:只读，w:只写,(会把之前的清空)
# seek是调整光标的位置  一个字是三个字节
# file_object.seek(3)
# file_object.write('我')
# 读取文件
content = file_object.read()
print(content)
file_object.write('66')
#关闭文件
file_object.close()
'''
# 可读可写 w+
# 写入时会将文件清空，读取时需要调整光标
'''
file_object = open('c.txt', mode = 'w+',encoding = 'utf-8')
data = file_object.read()
print(data)
file_object.write('clara')
file_object.seek(0)# 将光标调整到最前面
data1 = file_object.read()
print(data1)
file_object.close()
'''

#  a 追加
'''
file_object = open('c.txt', mode = 'a+',encoding = 'utf-8')
file_object.seek(0)# 将光标调整到最前面，字节
data = file_object.read()# 读的时候可以调整 光标移动， 写的时候只能在后面追加上
print(data)
file_object.close()
'''
# r 读操作
'''
file_object = open('c.txt',mode='r',encoding='utf-8')
# 读取文件的所有内容到内存
# data = file_object.read(1)
# 读取 文件前一个字符
# data = file_object.read(1)# 取得是字符
# 读取文件的所有内容到内存，并按照每一行进行分割到列表中
# data_list = file_object.readlines()
# print(data_list)
# file_object.close()
# 如果以后读取一个特别大的文件（********）
for line in file_object:
    line = line.strip() #可以去掉换行符
    print(line)
file_object.close()
'''
# w写操作
'''
#  一般用于文字写入
file_object = open('c.txt', mode='w', encoding='utf-8')

file_object.write('因为一个人\n')
file_object.write('那个人')
file_object.close()
'''
# 另一种写入方式
# 一般用于图片、音频、视频、未知编码
'''
f = open('c.txt',mode = 'wb')
1. 要把写入的字符串转成二进制
data ='我好困'
datawrite = data.encode('utf-8') # 将字符串按照utf-8编码转成二进制
# 将二进制写到文件中
f.write(datawrite) # wb打开文件，则write传入的是二进制
f.close()
'''
# r
'''
file_open = open('c.txt',mode ='r',encoding='utf-8')
# 1.读取硬盘上的010102
# 2.将 010101 按照encoding = utf-8 编码，转换成字符串
data = file_open.read()
file_open.close()
print(data)
'''
'''
file_open = open('c.txt',mode ='rb')
#  直接读取到的是二进制的数据
data = file_open.read()
#date =data.decode('utf-8')
file_open.close()
print(data)
'''
# 变小写 casefold 可以把拉丁文字变成小写
# v = 'CLARAΑΗ'
# v1 = v.casefold()
# print(v1)
# 判断是否是10进制的数 推荐用的isdecimal
'''
v = ['alex','eric','tony']
for i in v:
    print(i)
num = input('请输入序号：')
if num.isdecimal():
    num = int(num)
    print(v[num])
else:
    print('你输入的')
'''
# strip 不仅可以去空格，也可以去你想去的东西(字符串)，+\y+\nm
# v1 ='clatra'
# print(v1.strip('ra'))
#  center 居中
# v  = 'clara'
# c1 = v.center(20,'*')
# print(c1)
# ljust
# v  = 'clara'
# c1 = v.ljust(20,'*')
# print(c1)
################################
'''写入
v = open('c.txt', mode='a', encoding= 'utf-8')
while True:
    val =input('请输入：')
    v.write(val)
    v.flush() # 强制从内存写到文件上
v.close()
'''
#关闭文件 牛逼方法
# 文件内容的修改
'''
with open('c.txt',mode='r',encoding='utf-8') as v:
    data = v.read()# 缩进中的代码执行完毕后，自动关闭文件
    new_data = data.replace('好困','666')
with open('c.txt' ,mode= 'w', encoding='utf-8') as v:
    data = v.write(new_data)
'''
# 大文件修改
'''
f1 = open('c.txt',mode='r',encoding='utf-8')
f2 = open('a.txt',mode='w',encoding='utf-8')
for line in f1:
    new_line = line.replace('666','clara')
    f2.write(new_line)
f1.close()
f2.close()
'''
# 牛逼做法，不需要文件关闭
'''
with open('c.txt',mode='r',encoding='utf-8') as f1,open('a.txt',mode='w',encoding='utf-8') as f2:
    for line in f1:
        new_line = line.replace('我', 'doctor')
        f2.write(new_line)
'''
# 三元运算（三目运算）
# v = 前面 if  条件  else  后面
# 让用户输入值，如果值是整数，则转换成整数，否则赋值为None
'''
data = input('>>>')
value = int(data) if data.isdecimal() else None
print(value)
'''
#  函数
# def Mingming():
#     print('clara')
# 函数的基本结构
# def 函数名（）：
#    函数内容
#   pass
# 函数的执行
#  函数名（）
# 定义的函数中有参数：形参和实参
'''
def lista(a):
    v = [11,33,44,56,78]
    print(v[a])
lista(1)
lista(3)
'''
# 请写一个函数，函数计算列表info =[11,22,33,44,55]中的所有元素的和
# info =[11,22,33,44,55]
# sum =0
# index =0
# for item in range(0,len(info)):
#     sum += info[item]
# print(sum)
# 用函数的形式展示
'''
def summ(a):
    index = 0
    sum = 0
    for item in range(0,len(a)) :
        sum += a[item]
    print(sum)
info =[11,22,33,44,55]
summ(info)
'''
# 另一种写法
'''
def summ(a):
    index = 0
    sum = 0
    for item in a:
        sum += item
    print(sum)
info =[11,22,33,44,55]
summ(info)
'''
#  请写一个函数，函数将两个列表拼接起来
'''
a = [1, 2, 3]
b = [5, 6, 7]
for item in b:
    a.append(item)
print(a)
'''
# 一种方法 用append
'''
def linkboth(a,b):
  for item in b:
     a.append(item)
  print(a)
a = [1, 2, 3]
b = [5, 6, 7]
linkboth(a,b)
'''
# 另一种方法 extend
'''
def join_list(a,b):
    result =[]
    result.extend(a)
    result.extend(b)
    print(result)
a = [1, 2, 3]
b = [5, 6, 7]
join_list(a,b)
'''
# 让用户输入一段字符串，计算字符串中有多少E字符
'''
def countstr(a):
    count = 0
    for item in range(0,len(a)):
        if a[item] == 'E':
           count += 1
    return count
with open('a.txt',mode='a',encoding='utf-8') as v:
   count1= countstr(input('请输入你的内容：'))
   for i in range(1,count1):
      v.write('李少奇')
      '''
# print(countstr(input('请输入你的内容：')))
# 计算输入的内容有多少个E
'''
def countstr(a):
    count = 0
    for item in a:
        if item == 'E':
           count += 1
    return count
'''
'''
打开文件 并添加多少个李少奇
with open('c.txt',mode='a+',encoding='utf-8') as v:
   count1= countstr(input('请输入你的内容：'))
  # for i in range(0,count1-1):
   # 另一种简单的
   counter = '李少奇'* count1
   v.write(counter)
'''
#  换成函数
'''
def write_file(line):
    if len(line) == 0:
        return False# 函数执行过程中，一旦遇到return 则停止函数的执行
    with open('c.txt',mode='w',encoding='utf-8') as f:
        f.write(line)
    return True
count1= countstr(input('请输入你的内容：'))
counter = count1 * '李少奇'
status = write_file(counter)
if status:
    print('写入成功')
else:
    print('错误')
'''
# 写函数，计算一个列表中的有多少个数字，打印：列表中有%s 个数字
# 提示：type('x')==int 判断是否是数字
'''
def countnum(t):
    count = 0
    for item in t :
        if type(item) == int:
            count +=1
    return count

c = ['fe','fefe',1, 2, 3, 4]
b = countnum(c)
print('列表中有%s个数字' % (b,))
'''
# 写函数，计算一个列表中偶数索引位置的数据构造另外一个列表，并返回。
# quen= ['fe','fefe',1, 2, 3, 4]
# quena=[]
# for item in range(0, len(quen)):
#     if item % 2 == 0:
#         quenaa = quen[item]
#         quena.append(quenaa)
# print(quena)
# 编写的函数
'''
def enven(quen):
    quena = []
    for item in range(0,len(quen)):
        if item % 2 == 0 :
           quena.append(quen[item])
    return quena
c = ['fe','fefe',1, 2, 3, 4,9]
print(enven(c))
'''
# 另一种写法 ，用的应该是切片
'''
def get_data_list(arg):
    v = arg[::2]
    return v
vq =[45, 56, 33, 2, 8]
data = get_data_list(vq)
print(data)
# '''
# date = list(range(0,7))
# print(date)
# 读取文件，将文件的内容构造成指定格式的数据，并返回
'''
a.log 文件
alex|123|18
eric|ifds|19
...
目标结构：
a.['alex|123|18','eric|ifds|19']并返回。
b.[['alex','123','18'],['eric','ifds','19']]
c.[
   {'name':'alex','pwd':'123','age':18},
   {'name':'eric','pwd':'123','age':19},
]
'''
# ['alex|123|18','eric|ifds|19']
'''
def readfile1():
    with open('a.txt',mode='r',encoding='utf-8') as f:
       
        a = f.read()
        b = a.split('\n')
        return b
print(readfile1())
'''
# ['alex|123|18','eric|ifds|19']

# def readfile2():
#     new_list = []
#     with open('a.txt',mode='r',encoding='utf-8') as f:
#         a = f.read()
#         b = a.split('\n')
#         for x in b:
#             data = x.split('|')
#             new_list.extend(data)
#         return new_list
# print(readfile2())
#
'''
def readfile3():
    new_list = []
    o = []
    with open('a.txt',mode='r',encoding='utf-8') as f:
        a = f.read()
        b = a.split('\n')
        dict1 = {}
        for x in b:
            data = x.split('|')
            new_list.append(data)
        val=['name','pwd','age']
        for i in new_list:
            for item in range(len(i)):
               dict1[val[item]] = i[item]
            print(dict1)
print(readfile3())

'''
# def readfile():
#     v = []
#     with open('a.txt',mode='r',encoding='utf-8') as f:
#         '''使用extend 可实现拼接效果
#         a = f.read()
#         b = a.split('\n')
#         v.extend(b)# ['alex|123|18', 'eric|ifds|19']'''
#         #  v.append(f.readlines())
#         #  #[['alex|123|18\n', 'eric|ifds|19']]
#         content = f.read()
#         b = content.split('\n')
#         s = {}
#         for i in  b:
#             a = i.split('|')
#             v.append(a)
#         val=['name','pwd','age']
#         for item in range(len(v)):
#              s[val[item]]= v[item]
#         return v
# print(readfile())
#  定义一个函数，在在奇数位置返回其位置信息，生成新的列表或元组
#  使用的是切片
'''
def func(data_list):
    val=data_list[1::2]
    return list(val)
print(func([1,2,3,4,5]))
print(func((1,2,3,4,5,2)))
'''
# 判断列表或元组中的个数是否大于5，返回Ture
'''len
def func(data):
    if len(data)>5 :
        return True
    else:
        return False
print(func([3,44,23,5]))
'''
# 判断两个数的大小
# 三元运算
'''
def func(a,b):
    return a if a>b else b
print(func(2,3))
'''
# 用户输入：姓名、性别、年龄、教育，将这个四个用‘*’拼接起来,
# '可用格式化输出、或是join
'''
name = input('请输入你的名字')
gender = input('请输入你的性别')
age = input('请输入你的年龄')
edu = input('请输入你的学历')
def func(name, gender, age, edu):
    # data_list=[name,gender,age,edu]
    # return  '*'.join(data_list)
    v = "%s*%s*%s*%s" %(name,gender,age,edu)
    return v
print(func(name, gender, age, edu))
'''
# 验证用户名在文件data.txt中是否存在，若是存在返回True，否则返回False
# 函数有个一参数，用于接受用户输入的用户名
#name = input('请输入用户名：')
'''
def func(name):
    with open('a.txt',mode='r',encoding='utf-8') as file:
       content= file.read()
       flag = False
       row_list = content.split('\n')
       for item in row_list:
           v = item.split('|')
           if v[0] == name:
               flag =True
               break
    return flag
print(func('alex'))
'''
# [1,1,2,3,5,....]并设定一个范围,斐波那契数列
'''
def func(max_range):
    result =[]
    while True:
        if len(result) == 0:
            result.append(1)
        elif len(result) ==1:
            result.append(1)
        else:
            val = result[-1]+result[-2]
            if val >max_range:
                break
            result.append(val)
    return  result
print(func(100))
'''
# 参数中的关键字，需要放在后面
# func(a,d,c=10)
# 万能参数
# * args 可以接受任意个数的位置参数，并将参数转换成元组
# def func(*a):
#     print(a)
# func(1,2) # (1, 2)
# func((1,2,34,23,66))# ((1, 2, 34, 23, 66),)
# func(*(1,2,90,34,78))#(1, 2, 90, 34, 78)
# 字典{'k1': 1} # ** kwargs 可以接受人一个数的关键字参数，将参数转换成字典
# def  func(**v1):
#     print(v1)
# func(k1=1)
# 作用域
##############
# 子作用域只能找到父级中的值，默认无法重新为父级的变量进行赋值。
#
'''
name ='oldboy'
def func():
   name = 'alex'#  在自己作用域再创建一个这样的值
   print(name)
func()
print(name)
'''

############### 元组内容不能改
'''
name = [1,2,3,4]
def func():
    name.append(00)
    print(name)
func()
print(name)
'''
#####################如果非要对全局的变量赋值，global
'''
name ='oldboy'
def func():
    global  name
    name = 'alex'#  在自己作用域再创建一个这样的值
    print(name)
func()
print(name)
'''
# 添加 global 是找到对全局的变量进行的修改,利用ninlocal 可以找到找到上一级的东西
'''
name ='oldboy'
def func():
    name = 'clara'
    def inner():
        nonlocal name
        name = 'alex'#  在自己作用域再创建一个这样的值
    inner()
    print(name)
func()
print(name)
'''
# 以后的全局变量要用大写
'''
USER_LIST =[11,33,43]
def func():
    name= 'as'
    USER_LIST.append(name)
    return USER_LIST
print(func())
'''
# 函数小高级
# 会混淆的
'''
def func():
    print(123)
print(func)# <function func at 0x0000000001D2C2F0>
print(func())# 123
'''
'''
def func():
    return 123
print(func)# <function func at 0x0000000001D2C2F0>
print(func())# 123
'''
# 函数可以当做参数进行传递
'''
def func(arg):
    v1 =arg()
    print(v1)
def  show():
    print(888)
result = func(show)
print(result)
'''
#  面试题：
#  字典的运用
# 如有10个函数,让你输入f1,f2,f3,f4,f5 进行选择，用到字典
'''
def func():
    print('xx')
def bar():
    print('clara')
def base():
    print('clara')
def show():
    print('clara')
info ={
    'f1' : func,
     'f2':bar,
    'f3': base,
    'f4':show
}
choice = input('请输入要选择的功能')
function_name = info.get(choice)
if function_name:
    function_name()
else:
    print('不存在')
'''
# lambda 表达式
 # 三元运算 ，为了解决简单的if else,如：
    # a =123 if 1==a else 456
# lambda 表达式，为了解决简单函数的情况，如：
'''
def func(a,b):
    return a+b
f = lambda a,b: a+b
print(f(3,5))
f1 = lambda  x1:x1 *10
print(f1(3))
f2 = lambda  *args,**kwargs:len(args)+len(kwargs)
print(f2('fds,fe','ooepep,o'))
'''
#  用lambda 解决两个值的比较
'''
func =  lambda a,b: a if a>b else b
print(func(10,9))
'''
#  列表中的所有方法基本上都是返回None
# 字符串的所有方法基本上都有返回值
# 内置函数
# 商和余数
# a,b =divmod(1003, 5)
# print(a, b)
# 练习题
'''
USER_LIST=[]
for i in range(0,50):
    temp = {'name':'Clara%s'% i,'email':'123@qq.com%s'% i}
    USER_LIST.append(temp)
    '''
#print(USER_LIST)
# 请通过分页对数据进行展示
'''
要求：
  每页显示10条数据  用到切片
  让用户输入要查看的页面：页码
   a, b = divmod(len(USER_LIST), 50)
'''
'''
# 有多少个数据
data_length= len(USER_LIST)
#  一页显示10条数据
data = 10
# 总页码
total_number,b= divmod(data_length,data)
if b>0:
    total_number +=1
paper = int(input("请输入查看的页码："))
if paper < 0 or paper> total_number:
    print('页码不合法，必须是1~%s'%total_number)
else:
      start =(paper-1)* data
      end = paper*data
      datar =USER_LIST[start:end]
      for item in datar:
        print(item)
'''
'''
进制转换相关：
   bin:将其他进制转换成二进制
   oct:将其他进制转换成八进制
   int:讲其他进制转换成十进制
  hex:讲其他进制转换成十六进制

'''
# 面试题：
# 请将ip = '192.168.12.79'中的每个十进制转换成二进制并通过，连接起来生成一个新的字符串
'''
ip = '192.168.12.79'
content = ip.split('.')
print(content)
result = []
for i in content:
    content_bin = bin(int(i))
    result.append(content_bin)
    content_done = ','.join(result)
print(content_done)
'''
# 2.将ip = '192.168.12.79'中的每个十进制转换成二进制 :
# 110000001010100011001001111转换成十进制
# a = '110000001010100011001001111'
# b= int(a,base=2)
# print(b)

# 新浪微博测试题
'''
def func():
    for num in range(10):
        pass
    v4 = [lambda :num+10,lambda :num +100,lambda :num+1000]
    result= v4[1]()
    num =73
    result1 = v4[2]()
    print(result,result1)
func()
# 109 1073
'''
# 函数中高级（闭包/高阶函数）
# 内置模块（.py文件）
# pow 是求几次方
# print(pow(3,2))
# round 保留几位小数点
# 设计的有无返回值
'''
Data =[]
def func(arg):
    Data.insert(0,arg)
    return None
dat = func('clara')
print(dat) # None
print(Data) # ['clara']
'''
'''
函数内部的数据是否会混乱。 
函数内部执行相互之间不会混乱
执行完毕+内部元素不被其他使用-销毁

'''
# 函数中高级
# 1.1 函数可以做返回值

'''
def func():
    print(123)
def bar():
    return func
v = bar()
print(v)
print(v())
v()
'''
'''
name = 'clara'
def bar(name):
    def inner():
        print(name)
    return inner
v1 = bar('alex') # {name =alex,inner} # 闭包 为函数创建一块区域（内部变量供自己使用，）为他以后执行提供数据
v2 = bar('eric') #{ name =eric, inner }
v1()
v2()
'''
#  注意：函数在何时被谁创建
# info =[]
# def func():
#     print(item)
# for item in range(10):
#     info.append(func)
# info[0]() #9

#  闭包例子
'''
info =[]
def func(i):
    def inner():
      print(i)
    return inner
for item in range(10):
    info.append(func(item))
info[0]()  #0
info[1]() #1
info[4]() # 4
'''
# 闭包
'''
def func(name):
    def inner():
        print(name)
    return inner
v1 = func('alex')
v1()
v2 = func('eric')
v2()
'''
# 高阶函数
#     对函数进行赋值
#     把函数当做参数传递
#     把函数当作返回值
#闭包概念：为函数创建一块区域并为其维护自己数据，以后执行方便调用（应用场景：装饰器/SQLAlchemy源码）
# 内置函数（不是重点，但是面试会问的）
# 编码相关
# chr() 将十进制数字转换成unicode编码中的对应字符串
# ord()将unicode编码转换成十进制数字中的对应字符串
# a = 'A'
# print(ord(a))
# chr() 随机验证码的应用
'''
import  random
def get_random_code(length=6):
    data = []
    for i in range(length):
         v = random.randint(65,90)
         data.append(chr(v))
    return ''.join(data)

code =get_random_code()
print(code)
'''
# 高级函数
# map()遍历序列，可用于 元组、集合、列表。统一操作，对序列中每个元素进行操作，最终获的新的序列
#v1 =[11,33,44,22]
# def func(arg):
#     return arg+100
# result =map(func,v1)# 第一个参数是函数， 第二个参数必须：可迭代类型（可以被for循环）
# print(list(result))
# 可换成lambda表达式
'''
result = map(lambda  x:x +100,v1)
print(list(result))
'''
# map:循环每个元素（第二个参数），然后让每个元素执行函数（第一个参数），将每个函数执行的结果保存到新的列表中，并返回。
# filter :对序列中的元素进行筛选，最终获取符合条件的序列
v1 =[11,33,'fe','efjeo',44,22]
# def func(x):
#     if type(x) ==int:
#       return True
#     return False
# result= filter(func,v1)
# 换乘Lambda表达式加 三元运算
# result =filter(lambda x: True if type(x)==int else False,v1)
# result =filter(lambda x: type(x)==int ,v1)
# print(list(result))
# reduce:对于序列中所有元素进行累积操作
# import _functools
# v1= [1,2,3,4,5,6]
# def func(x,y):
#     return x+y
# result = _functools.reduce(func,v1)
# result = _functools.reduce(lambda x,y:x+y,v1)
# print(result)
# 面试题： 常用的内置函数有哪些
# filter/map /reduce 是什么意思
# 模块--加密
#  将制定的字符串加密
'''
import hashlib
def get_md5(data):
   obj = hashlib.md5()
   obj.update(data.encode('utf-8'))
   result = obj.hexdigest()
   return result
val =get_md5('123')
print(val)
'''
# Md5 加密时 加盐
'''
import hashlib
USER_LIST=[]
def get_md5(data):
   obj = hashlib.md5('gklfdjgoerwopkd'.encode('utf-8'))#  此处为加盐
   obj.update(data.encode('utf-8'))
   result = obj.hexdigest()
   return result
# val =get_md5('123')
# print(val)
def register():
    print('请创建用户：')
    while True:
        user =input('请输入用户名：')
        if user =='N':
            return
        pwd = input('请输入密码:')
        temp= {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)
def login():
    print('*********用户登录***********')
    user = input('用户输入：')
    pwd = input('请输入秘密：')
    for item in USER_LIST:
        if item['username']==user and item['password']==get_md5(pwd):
            return True
register()
result = login()
if result:
    print('登陆成功')
else:
    print('登录失败')
    '''
#   输入密码不显示 getpass,只能在终端运行
# import  getpass
# pwd = getpass.getpass('请输入密码：')
# if  pwd =='123':
#     print('CORRECT')
# 装饰器
# 推导式  99乘法表 一行代码实现
#  总结
# func_list =[]
# for i in range(10):
#     func_list.append(lambda :i)
# print(func_list)
# func_list[2]()
'''
def base(arg):
   return arg
def func(arg):
   def inner():
      return arg
   return inner
base_list = []# [base,base,]
func_list = [] # [由第一次执行func函数的内存地址，内部arg=0创建的inner函数，有arg=1 的inner 函数]
for I in range(10):# i=0 ,…
base_list.append(base)
func_list.append(func(i))
# 1. Base_list,和func_list中分别保存的是什么？
 Base_list中存储都是base函数
 Func_list中存储的是inner函数，特别是要说的是每个inner是在不同的地址创建
# 2.如果循环打印什么？
 for item in base_list:
v=item()# 执行base函数
print(v)# 都是9
for data in func_list:
v=data()
print(v)# 0 1 2 3 4 
'''
# 总结
'''
传参：位置参数》 关键参数
函数不被调用，内部代码永远不执行
每次调用函数时，都会为此条用开辟一块内存
'''
'''
def func(*args,**kwargs):
    print(args,kwargs)
#func(12,3,[11,22]) # func(12,3,[11,22])# 不加* 就是三个
func(12,3,*[11,22])# (12, 3, 11, 22) 加* 有四个元素
'''
# def func(arg):
#     return arg.pop(1)
# result = func([11,22,33,44])
# print(result)
# func_list =[]
# for i in range(10):
#     func_list.append(lambda  x:x +i)
# for j in range(0,len(func_list)):
#     result = func_list[j](j) # 0+9 /1+9
#     print(result)
'''
func_list =[]
for i in range(10):
    func_list.append(lambda  x:x +i)
for i in range(0,len(func_list)):
    result = func_list[i](i) # 0+0/1+1
    print(result)
'''
# 看是否执行（调用）函数
'''
def func(name):
    return lambda  x : x+name
v1 = func(1) 
v2 = func(2)
result1 = v1(10)
result2 = v2(10)
print(v1)# <function func.<locals>.<lambda> at 0x00000000021B9EA0>
print(v2)# <function func.<locals>.<lambda> at 0x00000000021D8048>
print(result1)# 11
print(result2)# 12 
'''
'''
def func(num):
    def inner():
        print(num)
    return inner
result = []
for i in range(10):
    f = func(i)
    result.append(f)
print(i)
print(result)
v1 = result[0]()
v2 = result[9]()
print(v1,v2)
'''
'''
答案：
9
[<function func.<locals>.inner at 0x00000000021B9EA0>, <function func.<locals>.inner at 0x00000000021D8048>, <function func.<locals>.inner at 0x00000000021D80D0>, <function func.<locals>.inner at 0x00000000021D8158>, <function func.<locals>.inner at 0x00000000021D81E0>, <function func.<locals>.inner at 0x00000000021D8268>, <function func.<locals>.inner at 0x00000000021D8488>, <function func.<locals>.inner at 0x00000000021D8510>, <function func.<locals>.inner at 0x00000000021D8598>, <function func.<locals>.inner at 0x00000000021D8620>]
0
9
None None

'''
# 装饰器
'''
def base():
    print(1)
def bar():
    print(2)
bar = base
bar()
'''
'''
def func(arg):
    def inner():
        return arg()
    return inner
def f1():
    print(123)
    return 666
v1 = func(f1)
result = v1() # 执行inner函数，/f1含函数-》123
print(result) #666
'''
# 装饰器
def func(arg):
    def inner():
        print('before')
        v = arg()
        print('after')
        return v
    return inner
@func # 第一步：执行func函数并将下面的函数参数传递func(index)
      # 将func的返回值重新赋值给下面的函数名。index=func(index)
def index():
    print(123)
    return 666
#实例
# index = func(index)
# index()
print(index())
